#include<iostream>
#include<pthread.h>
#include<string>
#include<cstdlib>
#include<unistd.h>
#include<functional>
#include<cassert>
using namespace std;
#define NUM 1024


class Thread
{   using func_t =function<void*(void*)>;
    static void* routine(void*args)//为中转函数调用
    {
        Thread *_this =static_cast<Thread*> (args);
        return _this->callback();
    }
  public: 
  Thread()//类构造，给线程取名
    {  
       char buffer[NUM];
       snprintf(buffer,sizeof(buffer),"thread -%d",threadnum++);
       _name=buffer;
    }
    
    void start(func_t func,void *args=nullptr)//线程运行时，创建出线程，以及传递参数和任务
    {  _func=func;
        _args=args;//将函数的参数通过封装后传进类中，由this指针来调用成员变量的方法调用函数参数去调用函数
    
        int n=pthread_create(&_id,nullptr,routine,this);
        assert(n==0);
        (void)n;
    }
    void join()
    {
      pthread_join(_id,nullptr);
    }
    void* func(void*args) //通过静态函数调用类成员
    {
        return _func(args);
    }




   ~Thread(){}
   
   void *callback(){
    return _func(_args);
   }
   string threadname()
{
     return _name;
}


private:
 pthread_t _id;//线程pid
 string _name;//线程名
 func_t _func;//线程调用的任务
 void* _args;//传递到任务函数的参数
 static int threadnum;//静态变量，标志线程的数量，用于取名

};
int Thread::threadnum=1;